package org.ytor.common.util.json.status;

import org.ytor.common.util.json.AbsJsonState;
import org.ytor.common.util.json.ContextType;
import org.ytor.common.util.json.JsonFsm;

/**
 * created by yangtong on 2025/4/14 22:41:56
 * <br/>
 * 表示准备读取json键值对的value
 */
public class ExpectValueState extends AbsJsonState {

    @Override
    public void handleNonWhitespace(JsonFsm fsm, char c) {
        //在EXPECT_VALUE状态下，如果读取到'"'，则说明value是字符串，切换到IN_STRING_VALUE状态
        if (c == '"') {
            fsm.changeState(IN_STRING_VALUE);
            //'"'肯定是不能写入字符串中，所以先清空缓存，再写入
            fsm.cleanBuffer();
        }
        //在EXPECT_VALUE状态下，如果读取到数字，则说明读取到的value是数值，切换到IN_NUMBER_VALUE状态
        else if (Character.isDigit(c) || c == '-') {
            fsm.changeState(IN_NUMBER_VALUE);
            //先清空缓存，再写入数字
            fsm.cleanBuffer();
            fsm.writeBuffer();
        }
        //以't'开头,表面希望读到true
        else if (c == 't') {
            fsm.changeState(IN_LITERAL_VALUE);
            fsm.cleanBuffer();
            fsm.writeBuffer();
            fsm.targetLiteral("true");
        } else if (c == 'f' || c == 'F') {
            fsm.changeState(IN_LITERAL_VALUE);
            fsm.cleanBuffer();
            fsm.writeBuffer();
            fsm.targetLiteral("false");
        } else if (c == 'n') {
            fsm.changeState(IN_LITERAL_VALUE);
            fsm.cleanBuffer();
            fsm.writeBuffer();
            fsm.targetLiteral("null");
        }
        //表示属于对象
        else if (c == '{') {
            fsm.nesting(ContextType.OBJECT);
            fsm.changeState(EXPECT_KEY);
        }
        //表示属于数组
        else if (c == '[') {
            fsm.nesting(ContextType.ARRAY);
            fsm.changeState(IN_ARRAY_VALUE);
        } else {
            throw new RuntimeException("意料之外的字符，【" + c + "】");
        }
    }
}
